#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

enum class IOS          //枚举
{
    OPEN,
    NOT_OPEN
    SEEK_SET //可以用枚举
};

class File
{
public:
/* 无参构造：文件打开失败 */
    File()
    {
        m_flag = IOS::NOT_OPEN;                         //打开失败
    }
/* 构造函数：打开文件 */
    File(string filename, string mode)                  //构造时候传入文件名以及打开方式
    {
        m_fp = fopen(filename.c_str(), mode.c_str());   //打开文件，c_str()转成char*

        if (m_fp == nullptr)                            //文件为空，则异常
        {
            m_flag = IOS::NOT_OPEN;
            throw("open file error");
        }

        m_flag = IOS::OPEN;                             //打开成功
    }
/* 析构函数：关闭文件 */
    ~File()
    {
        fclose(m_fp);
    }
/* 打开文件操作 可于无参构造一起用 */
    void open_file(string filename, string mode)
    {
        m_fp = fopen(filename.c_str(), mode.c_str());

        if (m_fp == nullptr)
        {
            m_flag = IOS::NOT_OPEN;
            throw("open file error");
        }

        m_flag = IOS::OPEN;
    }
/* 从键盘获取数据 */
    char get_char()
    {
        char temp;
        
        if (m_flag == IOS::OPEN)        //文件可以打开
        {
            temp = fgetc(m_fp);         //读一个字符
        }
        else
        {
            throw("file is not open!\n");
        }

        return temp;
    }
/* 读一行数据 */
    string get_line()
    {

    }
/* 读所有数据 */
    string get_all()
    {

    }
/* 读二进制文件 */
    template <typename U>
    U get_bin()
    {
        U temp;
    }
/* 写入字符数据 */
    void write_data(string data)
    {

    }
/* 写二进制文件 */
    template <typename T>
    void write_bin(const T &data)       //接右值要用const
    {

    }
/* 移动位置 */
    void seek(long offset, int whence = SEEK_SET)   //移动到头，默认值为SEEK_SET
    {
        fseek(m_fp, offset, whence);
    }
/* 拷贝 */   
    void copy(const File &file);
/* 重载！*/
    bool operator!()
    {
        return m_flag == IOS::OPEN;
    }
/*追加重载+，两个文件赋值重载=，<>来进行比较*/
    //= + 
private:
    FILE *m_fp;
    IOS m_flag;     
};

int main(int argc, char **argv)
{
    File file("a.txt","w+");
    file.write_data("hello");
    file.write_bin<int>(5);

    return 0;
}